import matplotlib.pyplot as plt
import numpy as np
from matplotlib.font_manager import FontProperties


# 加载宋体字体
font_path = '/home/hujiahui/backend/fonts/simsun.ttc'
font = FontProperties(fname=font_path,size=18)
# 数据
cases = ['aes128', 'aes256', 'aes_cipher', 'or1200', 'sha3', 'usb_cdc_core', 'usbf_device']

# 传统流程的时间（单位：秒）
traditional_wiring = [7 * 60 + 3, 9 * 60 + 47, 2 * 60 + 38, 4 * 60 + 5, 50, 22, 3 * 60 + 0]  # 布线时间
traditional_timing = [77.1, 112.1, 23.3, 50.0, 11.0, 6.7, 35.0]  # 时序分析时间
traditional_total = [w + t for w, t in zip(traditional_wiring, traditional_timing)]  # 传统流程总时间

# TimingGCN 和 本文方法的时间（单位：秒）
timing_gcn = [0.59232, 0.7967, 0.44638, 0.59424, 0.16042, 0.10909, 0.48704]
our_method = [0.32698, 0.4157, 0.17512, 0.46852, 0.07519, 0.05526, 0.33743]

# 计算加速比（保留1位小数）
speedup_traditional = [format(t / o, '.1f') for t, o in zip(traditional_total, our_method)]
speedup_timing_gcn = [format(t / o, '.1f') for t, o in zip(timing_gcn, our_method)]

# X轴位置
x = np.arange(len(cases))
width = 0.26  # 柱状图宽度

plt.figure(figsize=(13, 6))
plt.yscale('log')


# 传统流程的堆叠柱状图（布线 + 时序分析）
bar_wiring = plt.bar(x - width, traditional_wiring, width, label='布线', color='blue')
bar_timing = plt.bar(x - width, traditional_timing, width, bottom=traditional_wiring, label='时序分析', color='green')

# 绘制 TimingGCN 和 本文方法
bar_timing_gcn = plt.bar(x, timing_gcn, width, label='TimingGCN', color='orange')
bar_our_method = plt.bar(x + width, our_method, width, label='本文方法', color='red')

# 添加 X 倍数标注
for i in range(len(cases)):
    # 传统流程的顶部（布线 + 时序分析）
    total_height = traditional_wiring[i] + traditional_timing[i]
    plt.text(x[i] - width, total_height + total_height * 0.05, f'{speedup_traditional[i]}X', ha='center', fontsize=18, fontproperties=font)

    # TimingGCN 的顶部
    plt.text(x[i], timing_gcn[i] + timing_gcn[i] * 0.05, f'{speedup_timing_gcn[i]}X', ha='center', fontsize=18, fontproperties=font)

    # 本文方法顶部（基准 1X）
    plt.text(x[i] + width, our_method[i] + our_method[i] * 0.05, '1X', ha='center', fontsize=18, fontproperties=font)

# 添加标签和标题（指定字体）
#plt.xlabel('案例', fontproperties=font)
plt.ylabel('运行时间（秒）', fontproperties=font,fontsize=18)
#plt.title('运行时间对比', fontproperties=font)
# 设置 X 轴标签水平显示
plt.xticks(x, cases, rotation=0, fontproperties=font, fontsize=16)
plt.yticks(fontsize=15)

# 设置图例
#plt.legend(prop=font, fontsize=18)
plt.legend(loc='upper center', bbox_to_anchor=(0.5, 1.15), ncol=5, fontsize=14, prop=font)
# 保存图片
plt.tight_layout()
plt.savefig('runtime_comparison.png', dpi=600, bbox_inches='tight')

# 显示图表
plt.show()
